using System.Reflection;

namespace PowerManage.API.Extensions;

/// <summary>
/// 程序集扩展
/// </summary>
public static class AssemblyExtension
{
    /// <summary>
    /// 获取所有引用程序集的列表
    /// </summary>
    /// <param name="appDomain">应用程序域</param>
    /// <returns>返回所有引用程序集的列表</returns>
    public static List<Assembly> GetReferenceAssemblies(this AppDomain appDomain)
    {
        var assemblies = new List<Assembly>();
        //遍历当前应用程序域中的所有程序集
        foreach (var assembly in appDomain.GetAssemblies().ToList())
        {
            //递归获取引用程序集
            GetReferenceAssemblies(assembly, assemblies);
        }

        return assemblies;
    }


    /// <summary>
    /// 获取所有引用程序集的列表
    /// </summary>
    /// <param name="assembly">当前程序集</param>
    /// <param name="assemblies">存储所有引用程序集的列表</param>
    private static void GetReferenceAssemblies(Assembly assembly, List<Assembly> assemblies)
    {
        // 获取当前程序集的所有引用程序集名称
        foreach (var assemblyName in assembly.GetReferencedAssemblies().ToList())
        {
            //使用 Assembly.Load 方法加载引用程序集
            var ass = Assembly.Load(assemblyName);
            //检查 assemblies 列表中是否已经包含该引用程序集
            if (!assemblies.Contains(ass))
            {
                assemblies.Add(ass);
                GetReferenceAssemblies(ass, assemblies);
            }
        }
    }
}